Workshop MOD: Visualisation de données omiques avec R

Auteur·rice

Rim Alhajal, Pauline Dusfour–Castan, Lilou Zulewski et Abdoulaye Diop

Introduction

Données

Les données qu’on utilisera dans ce Workshop se trouvent dans la librairie OmicCircos de R. Elles se basent sur des bases de données fournies par The Cancer Genome Atlas Program (TCGA). On s’intéresse aux données des patients diagnostiqués d’un cancer du sein. Voici la liste des tableaux utilisés :

  • TCGA.BC.cnv.2k.60 : Les variables dans ce tableau sont respectivement le chromosome, sa position et le nom du gène observé et les 60 autres variables représentent 60 individus différents.

  • TCGA.BC.fus : Ce tableau représente la fusion des deux gènes qui a eu place pour un individu préci.

Extrait du tableau fus
  • TCGA.BC.gene.exp.2k.60 : Sur 60 individus, on étudie une métrique en rapport avec l’expression du gène. Le chromosome, sa position et le nom du gène observé sont notés.

  • TCGA.BC.sample60 : On indique ici pour 60 cas quel type de cancer du sein le patient en souffre : LumA, LumB, Basal ou Her2.

  • TCGA.BC_Her2_cnv_exp : Dans ce tableau, des tests statistiques sont effectués et on récupère la t-value et la p-value. On note les métriques FDR et Bonferroni de plus.

  • TCGA.PAM50_genefu_hg18 : Il s’agit alors d’un ensemble de 50 gènes qui ont été identifiés comme une signature d’expression génique associée aux sous-types du cancer du sein (LumA, LumB, Basal, Her2 ou Normal) en fonction des schémas d’expression génique.

Extrait du tableau CNV

Recueillir les données

Afin de pouvoir mettre en oeuvre les différentes méthodes de visualisation, il nous faut tout d’abord recueillir les données et les travailler.

Pour cela, suivez les étapes présentées ci-dessous :

  • Etape 1 : Chargement de la librairie “Omiccircos”
library(OmicCircos)
  • Etape 2 : Importation des données
data("TCGA.PAM50_genefu_hg18")
data("TCGA.BC.fus")
data("TCGA.BC.cnv.2k.60")
data("TCGA.BC.gene.exp.2k.60")
data("TCGA.BC.sample60")
data("TCGA.BC_Her2_cnv_exp")
  • Etape 3 : Travail des données
Her2.i = which(TCGA.BC.sample60[,2] == "Her2")
Her2.n = TCGA.BC.sample60[Her2.i,1]
Her2.j = which(colnames(TCGA.BC.cnv.2k.60)%in%Her2.n)
cnv = TCGA.BC.cnv.2k.60[,c(1:3,Her2.j)]

cnv.m = cnv[,c(4:ncol(cnv))]
cnv.m[cnv.m > 2] = 2
cnv.m[cnv.m < -2] = -2
cnv = cbind(cnv[,1:3], cnv.m)

Her2.j = which(colnames(TCGA.BC.gene.exp.2k.60)%in% Her2.n)

gene.exp = TCGA.BC.gene.exp.2k.60[,c(1:3,Her2.j)]

Visualisations classiques

L’ensemble des visualisations ci-dessous s’appuient sur la base de données TCGA.PAM50_genefu_hg18.

Comparaison de Deux Densités

Commençons par étudier quelques densités des types de cancer. Voici un exemple très basique de visualisation graphique de la comparaison des densités des types de cancer LumA et LumB :

# création de la base de données
data <- data.frame(value = c(TCGA.PAM50_genefu_hg18$LumA,
                            TCGA.PAM50_genefu_hg18$LumB),
                   type = c(rep("LumA", 50),
                            rep("LumB", 50)))

# création du graphe
comparaison <- data %>%
    ggplot(aes(x=value, fill=type)) +
    geom_density()

# affichage du graphe
print(comparaison)

L’utilisation de ggplot nécessite la création d’une base de données contenant les variables utiles pour le graphe.

%>%

Cet opérateur est un pipe, fréquemment représenté par une barre verticale ‘|’ : il renvoie la sortie d’une commande vers l’entrée d’une autre.

De nombreuses options de ggplot peuvent améliorer l’apparence générale de ce graphe telles que ci-dessous.

# création du graphe
comparaison <- data %>%
  ggplot(aes(x=value, fill=type)) +
  geom_density(aes(color=type), alpha=0.4) +
  scale_color_manual(values = c("darkblue", "pink")) +
  scale_fill_manual(values = c("darkblue", "pink")) +
  theme(strip.text.x = element_text(size = 8),
        plot.title = element_text(hjust = 0.5, face="bold")) +
  xlab("Value") +
  ylab("Density") +
  guides(color = "none") +
  labs(title = "Density Comparaison of Cancer Types Gene Occurrence",
       fill = "Cancer Type")

# affichage du graphe
print(comparaison)

Il est également possible de représenter les densités sur deux graphes différents plutôt que de les superposer.

# création du graphe
comparaison <- data %>%
  ggplot(aes(x=value, fill=type)) +
  geom_density(aes(color=type), alpha=0.4) +
  scale_color_manual(values = c("darkblue", "pink")) +
  scale_fill_manual(values = c("darkblue", "pink")) +
  theme(strip.text.x = element_text(size = 8),
        plot.title = element_text(hjust = 0.5, face="bold")) +
  xlab("Value") +
  ylab("Density") +
  facet_wrap(~type, scales = "fixed")+
  guides(color = "none") +
  labs(title = "Density Comparaison of Cancer Types Gene Occurrence",
       fill = "Cancer Type")

# affichage du graphe
print(comparaison)

Utilisation de facet_wrap

Les échelles des différents graphiques peuvent être formater différemment à l’aide de l’option scales : “fixed” permet d’obtenir des échelles égales pour tous les graphes mais d’autres options telles que “free_x”, “free_y” ou “free” sont envisageables.

Le cancer de type Her2 est le type de cancer le plus courant parmi tous ceux présents dans la base de données support.

En vous appuyant sur l’exemple précédent, représentez graphiquement la comparaison des densités d’une personne atteinte d’un cancer de type Her2 et d’une personne saine.

Les données d’une personne saine sont contenues dans la variable Normal de la base de données.

Par la suite, les couleurs utilisées pour la représentation de Her2 et Normal seront respectivement darkred et darksalmon.

Afficher la Solution
# création de la base de données
data <- data.frame(value = c(TCGA.PAM50_genefu_hg18$Her2,
                            TCGA.PAM50_genefu_hg18$Normal),
                   type = c(rep("Her2", 50),
                            rep("Normal", 50)))

# création du graphe
comparaison <- data %>%
  ggplot(aes(x=value, fill=type)) +
  geom_density(aes(color=type), alpha=0.4) +
  scale_color_manual(values = c("darkred", "darksalmon")) +
  scale_fill_manual(values = c("darkred", "darksalmon")) +
  theme(strip.text.x = element_text(size = 8),
        plot.title = element_text(hjust = 0.5, face="bold")) +
  xlab("Value") +
  ylab("Density") +
  guides(color = "none") +
  labs(title = "Density Comparaison of Cancer Types Gene Occurrence",
       fill = "Cancer Type")

# affichage du graphe
print(comparaison)

Comparaison de Toutes les Densités

Pour mieux visualiser les différences entre les types de cancer, représentez la comparaison de la densité de l’ensemble des types de cancer.

Il est important de préciser au graphe que la variable doit être considéré comme une densité à l’aide de la commande aes(y=after_stat(density)).

Afficher la Solution
# création de la base de données pour le graphe
data <- data.frame(type = c(rep("LumA", 50),
                            rep("LumB", 50),
                            rep("Basal", 50),
                            rep("Her2", 50),
                            rep("Normal", 50)),
                  subtype = rep(TCGA.PAM50_genefu_hg18$chr, each = 50),
                  value = c(TCGA.PAM50_genefu_hg18$LumA,
                            TCGA.PAM50_genefu_hg18$LumB,
                            TCGA.PAM50_genefu_hg18$Basal,
                            TCGA.PAM50_genefu_hg18$Her2,
                            TCGA.PAM50_genefu_hg18$Normal))

# histogramme et densité des différents types de cancer
density <- data %>%
  ggplot(aes(x = value, fill = type)) +
  geom_density(aes(y = after_stat(density), color=type), linewidth=0.5, alpha=0.4, fill=NA) +
  scale_color_manual(values = c("#69b3a2", "darkred", "darkblue", "pink", "darksalmon")) +
  scale_fill_manual(values = c("#69b3a2", "darkred", "darkblue", "pink", "darksalmon")) +
  theme(strip.text.x = element_text(size = 8),
        plot.title = element_text(hjust = 0.5, face="bold")) +
  xlab("Value") +
  ylab("Density") +
  labs(title = "Density of Cancer Types", color = "Cancer Type")

# affichage du graphe
print(density)

Ajoutez les histogrammes respectifs des différents types de cancer sur le graphe précédent.

geom_histogram

Cette commande du package ggplot2 permet de créer des histogrammes sur R. De nombreuses options sont disponibles comme color, alpha (règle la transparence du remplissage), binwidth (règle la largeur des intervalles) et position = “identity”, “dodge” (règle la position des bandes).

Afficher la Solution
# histogramme et densité des différents types de cancer
density <- data %>%
  ggplot(aes(x = value, fill = type)) +
  geom_histogram(aes(y=after_stat(density)), color = "#e9ecef", alpha = 0.3, binwidth=0.5, position = "dodge") +
  geom_density(aes(y = after_stat(density), color=type), linewidth=0.5, fill=NA) +
  scale_color_manual(values = c("#69b3a2", "darkred", "darkblue", "pink", "darksalmon")) +
  scale_fill_manual(values = c("#69b3a2", "darkred", "darkblue", "pink", "darksalmon")) +
  theme(strip.text.x = element_text(size = 8),
        plot.title = element_text(hjust = 0.5, face="bold")) +
  labs(fill = "Cancer Type") +
  xlab("") +
  ylab("Density") +
  labs(title = "Density of Cancer Type") +
  guides(color = "none")

# affichage du graphe
print(density)

Fréquence des Gènes sur l’Ensemble des Chromosomes

En appliquant les compétences acquises jusqu’ici, représentez la fréquence des gènes de Her2 sous forme d’histogrammes et de densités pour chacun des chromosomes.

Afficher la Solution
# création de la base de données pour le graphe
data <- data.frame(
  type = TCGA.PAM50_genefu_hg18$chr,
  value = TCGA.PAM50_genefu_hg18$Her2
)

# histogramme de fréquence pour chaque chromosome
frequence <- data %>%
  ggplot(aes(x = value, bins=30, color = type, fill = type)) +
  geom_histogram(alpha = 0.6, position = "identity") +
  geom_density(aes(y=after_stat(ndensity)), alpha = 0.5, fill = "grey", color = "black", linewidth = 0.25) +
  scale_fill_viridis(discrete = FALSE) +
  scale_color_viridis(discrete = FALSE) +
  theme(strip.text.x = element_text(size = 8),
        plot.title = element_text(hjust = 0.5, face="bold")) +
  xlab("Chromosome") +
  ylab("Assigned Probability (%)") +
  facet_wrap(~type, scales = "fixed", nrow=3)+
  guides(color = "none", fill="none") +
  labs(title = "Frequency of Her2 Gene Occurrence on All Chromosomes")

# affichage du graphe
print(frequence)

De la même façon que le graphe précédent, représentez graphiquement la fréquence des gènes de chaque type de cancer sous forme d’histogrammes et de densités pour chacun des chromosomes.

Afficher la Solution
# création de la base de données pour le graphe
data <- data.frame(type = TCGA.PAM50_genefu_hg18$chr,
                   subtype = c(rep("LumA", 50),
                               rep("LumB", 50),
                               rep("Basal", 50),
                               rep("Her2", 50),
                               rep("Normal", 50)),
                   value = c(TCGA.PAM50_genefu_hg18$LumA,
                             TCGA.PAM50_genefu_hg18$LumB,
                             TCGA.PAM50_genefu_hg18$Basal,
                             TCGA.PAM50_genefu_hg18$Her2,
                             TCGA.PAM50_genefu_hg18$Normal))

# histogramme de fréquence pour chaque chromosome
frequence <- data %>%
  ggplot(aes(x = value, fill = subtype, color=subtype)) +
  geom_histogram(alpha = 0.6, position = "dodge") +
  geom_density(aes(y=after_stat(ndensity), color = subtype), alpha = 0.25, fill = "grey", size = 0.25) +
  scale_color_manual(values = c("#69b3a2", "darkred", "darkblue", "pink", "darksalmon")) +
  scale_fill_manual(values = c("#69b3a2", "darkred", "darkblue", "pink", "darksalmon")) +
  theme(strip.text.x = element_text(size = 8),
        plot.title = element_text(hjust = 0.5, face="bold")) +
  xlab("Chromosome") +
  ylab("Frequency") +
  facet_wrap(~type, scales = "fixed", nrow=3)+
  guides(color = "none") +
  labs(title = "Frequency of Cancer Type Gene Occurrence on Each Chromosome",
       fill = "Cancer Type")

# affichage du graphe
print(frequence)

Lexique

  • hg18 : La représentation du génome humain a connu plusieurs versions avant d’aboutir à la représentation la plus optimale. La version 18 s’agit de la version avant dernière.

  • Her2 : Une protéine naturellement présente dans l’organisme. Il s’agit d’un récepteur transmembranaire impliqué dans la régulation de la prolifération cellulaire.

  • LumA : Le cancer du sein Luminal A est l’un des sous-types luminaux et est généralement associé à des caractéristiques moins agressives par rapport à Luminal B.

  • LumB : Associé à un grade plus élevé, des taux de prolifération accrus, et un pronostic global plus défavorable.

  • Basal : Un sous-type du cancer du sein négatif pour les récepteurs d’oestrogène (ER), les récepteurs de progestérone (PR) et le récepteur 2 du facteur de croissance épidermique humain (HER2). On le désigne souvent comme un cancer du sein triple négatif (TNBC).

  • FDR (First Division Restitution) : Réfère à l’évènement où l’une des cellules filles produites lors de la première division méiotique conserve les deux chromatides d’un chromosome, sans subir la séparation normale en deux cellules distinctes. Cela aboutit à un gamète avec un ensemble complet de chromosomes, plutôt que la moitié attendue.

  • Bonferroni : Une correction statistique.